<?php

/**
 * Classe Commentaire
 * @author Jeremy
 * @author Remi
 * @version 1.0
 */
class Commentaire
{

    /**
     * @var int
     */
    protected $Id;
    /**
     * @var int
     */
    protected $IdAuteur;
    /**
     * @var int
     */
    protected $IdStage;
    /**
     * @var int
     */
    protected $DateCreation;
    /**
     * @var string
     */
    protected $Texte;
    /**
     * @var array
     */
    protected $Destinataires;

    /**
     *
     * @param int $idC
     */
    public function __construct($idC = 0)
    {

        // Traitement
        if (empty($idC))
        {
            // ID
            $this->IdAuteur = 0;
            $this->IdStage = 0;

            // STRING
            $this->Texte = ""; // TEXT
            // DATE (INT)
            $this->DateCreation = 0;

            $this->Destinataires = array();
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            // TODO --------------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            $query = '	SELECT Commentaire.*
			FROM Commentaire 
			WHERE Commentaire.IdCommentaire = :id;
					';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $idC, PDO::PARAM_INT);

            // Execution de la requete retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    // ID
                    $this->Id = $result->IdCommentaire;
                    $this->IdAuteur = $result->IdAuteur;
                    $this->IdStage = $result->IdStage;

                    // STRING
                    $this->Texte = $result->TexteCommentaire; // TEXT
                    // DATE (INT)
                    $this->DateCreation = $result->DateCreationCommentaire;

                    // Gestion erreur requete
                    $this->requeteOk = true;
                    $this->errormsg = "Commentaire trouve";

                    // Destinataires du commentaire --------------------
                    $query = '	SELECT IdDestinataire
				FROM DestinataireCommentaire
				WHERE DestinataireCommentaire.IdCommentaire = :id;';

                    $c = $sql->prepare($query);
                    $c->bindParam(':id', $idC, PDO::PARAM_INT);

                    if ($c->execute())
                    {
                        $this->Destinataires = array();
                        $i = 0;

                        $result = $c->fetchAll(PDO::FETCH_OBJ);
                        foreach ($result as $row)
                        {
                            $this->Destinataires[$i] = $row->IdDestinataire;
                            $i = $i + 1;
                        }
                    }
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = "Ce commentaire n'existe pas !";
                }
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
            }
        }
    }

    /**
     * Ajoute un commentaire dans la bd
     */
    public function insertCommentaire()
    {
        if(isset($this->Texte) && !empty($this->Texte))
        {
            $sql = SQL::getInstance()->getConnection();
            $query =
                    'INSERT INTO Commentaire
                    (
                            IdAuteurCommentaire,
                            IdStageCommentaire,
                            TexteCommentaire,
                            DateCreationCommentaire
                    )
                    VALUES
                    (
                            :idA,
                            :idS,
                            :texte,
                            :dateC
                    )';
            $sql->beginTransaction();
            try
            {
                $c = $sql->prepare($query);

                $c->bindParam(':idA', $this->IdAuteur, PDO::PARAM_INT);
                $c->bindParam(':idS', $this->IdStage, PDO::PARAM_INT);

                $c->bindParam(':texte', $this->Texte, PDO::PARAM_STR);

                $c->bindParam(':dateC', $this->DateCreation, PDO::PARAM_INT);

                if ($c->execute())
                {
                    $this->Id = $sql->lastInsertId();



                    $bool = true;
                    if (!empty($this->Destinataires))
                    {
                        $query2 = "INSERT INTO DestinataireCommentaire
                                (IdCommentaire,IdDestinataire)
                                VALUES
                                (:idCom, :idDest)";
                        foreach ($this->Destinataires as $dest)
                        {
                            if ($bool === false)
                            {
                                break;
                            }

                            if (!empty($dest))
                            {
                                $cDest = $sql->prepare($query2);
                                $cDest->bindParam(":idCom", $this->Id, PDO::PARAM_INT);
                                $cDest->bindParam(":idDest", $dest, PDO::PARAM_INT);
                                if ($cDest->execute())
                                {
                                    $bool = true;
                                }
                                else
                                {
                                    $bool = false;
                                }
                            }
                        }
                    }

                    if ($bool === true)
                    {
                        $sql->commit();
                        $c->closeCursor();
                        $this->requeteOk = true;
                        $this->errormsg = "";
                    }
                    else
                    {
                        $this->requeteOk = false;
                        $this->errormsg = $c->errorInfo();
                        $sql->rollback();
                        $c->closeCursor();
                    }
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = $c->errorInfo();
                    $sql->rollback();
                    $c->closeCursor();
                    $this->IdUtilisateur = 0;
                }
            }
            catch (PDOException $Exception)
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
                $this->Id = 0;
            }
        }
    }

    /*
     * @return string
     */

    public function toString()
    {
        $str = 'Commentaire[';
        $str = $str . '<br/>Id = ' . $this->Id;
        $str = $str . '<br/>Texte = ' . $this->Texte;
        $str = $str . '<br/>Destinataires = ';
        foreach ($this->Destinataires as $valeur)
        {
            $str = $str . ' ' . $valeur;
        }
        $str = $str . '<br/>]';

        return $str;
    }

    /**
     *
     * @return int
     */
    public function getIdCommentaire()
    {
        return $this->Id;
    }

    /**
     *
     * @return int
     */
    public function getIdAuteur()
    {
        return $this->IdAuteur;
    }

    /**
     *
     * @param int $value
     * @return mixed
     */
    public function setIdAuteur($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value > 0)
        {
            $this->IdAuteur = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id ne peut etre null !";
            }
            if (isset($value) && $value <= 0)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id ne peut etre <= 0 !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cet id n'est pas valide !";
            }

            $this->IdAuteur = 0;
        }
        return $errTab;
    }

    /**
     *
     * @return int
     */
    public function getIdStage()
    {
        return $this->IdStage;
    }

    /**
     *
     * @param int $value
     * @return mixed
     */
    public function setIdStage($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value > 0)
        {
            $this->IdStage = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id ne peut etre null !";
            }
            if (isset($value) && $value <= 0)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id ne peut etre <= 0 !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cet id n'est pas valide !";
            }

            $this->IdStage = 0;
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getTexteCommentaire()
    {
        return $this->Texte;
    }

    /**
     *
     * @param string $value
     * @return string
     */
    public function setTexteCommentaire($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "")
        {
            $this->Texte = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le texte ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le texte ne peut etre vide !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce texte n'est pas valide !";
            }

            $this->Texte = "";
        }
        return $errTab;
    }

    /**
     *
     * @return int
     */
    public function getDateCreationCommentaire()
    {
        return $this->DateCreation;
    }

    /**
     *
     * @param int $value
     */
    public function setDateCreationCommentaire($value)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        if (isset($value) && strlen($value) == 10)
        {
            $this->DateCreation = $value;
        }
        else
        {
            $errTab["boolOk"] = false;
            $errTab["errmsg"] = "Cette date n'est pas valide !";

            $this->DateCreation = 0;
        }
        return $errTab;
    }

    /**
     *
     * @param array $value
     * @return array
     */
    public function setIdsDestinataires($value)
    {
        $errTab = array("boolOk" => true, "errmsg" => "");
        if (isset($value) && !empty($value) && is_array($value))
        {
            $this->Destinataires = $value;
        }
        else
        {
            $errTab["boolOk"] = false;
            $errTab["errmsg"] = "Merci d'envoyer un array correct !";

            $this->Destinataires = array();
        }
        return $errTab;
    }

    /**
     *
     * @return array
     */
    public function getIdsDestinataires()
    {
        return $this->Destinataires;
    }

    /**
     * @static
     * @param int $idStage
     * @param int $idUser optionnal
     * @return array Array de Commentaire
     */
    static public function getListByIdStage($idStage, $idUser=0)
    {
        $sql = SQL::getInstance()->getConnection();

        $qList = "SELECT *
                  FROM Commentaire c ";
        if (isset($idUser) && !empty($idUser))
        {
            $qList .= " INNER JOIN DestinataireCommentaire dc ON dc.IdCommentaire = c.IdCommentaire ";
        }
        $qList .= " WHERE IdStageCommentaire = :idstage";
        if (isset($idUser) && !empty($idUser))
        {
            $qList .= " AND dc.IdDestinataire = :user";
        }
        $qList .= " ORDER BY DateCreationCommentaire ASC";

        $cList = $sql->prepare($qList);
        $cList->bindParam(":idstage", $idStage, PDO::PARAM_INT);
        if (isset($idUser) && !empty($idUser))
        {
            $cList->bindParam(":user", $idUser, PDO::PARAM_INT);
        }
        $cList->execute();
        $result = $cList->fetchAll(PDO::FETCH_OBJ);
        if (!empty($result))
        {
            return $result;
        }
        return array();
    }

}

?>